public class Main {
    public static void main(String[] args) {
        System.out.println("Hello world!");
        // ***** 文件操作 —— IO *****
        // 认识文件(文件这个词 在计算机里面 是 一次多用)
        // 我们先来认识 狭义上的文件(file): 指的是你的硬盘上的 文件 和 目录。针对硬盘这种持久化存储的I/O设备，当我们想要进行数据保存时，
        //往往不是保存成一个整体，而是独立成一个个的单位进行保存，这个独立的单位就被抽象成文件的概念，
        // 就类似办公桌上的一份份真实的文件一般。

        // 广义上的文件: 泛指计算机中的很多的 软硬资源. 操作系统中, 把很多的硬件设备和软件资源抽象成了文件 . 按照文件的方式来统一管理
        // 后面讲到的网卡 网卡, 操作系统也是把网卡当成了一个文件

        // (此处一讨论狭义方面的文件)

        // 之前咱们的代码里, 存储数据, 主要是靠变量 . 变量是在内存当中的. 现在的文件则是在硬盘上的

        //  文件除了有数据内容之外，还有一部分信息，例如文件名、文件类型、文件大小等并不作为文件的数据
        //而存在，我们把这部分信息可以视为文件的元信息。

        // 每个文件, 在硬盘上都有具体的"路径"
        // 一个 / 来分割不同的目录级别

        // **** 文件路径（Path） ****

        // (最好建议 / (正斜杠)) ( \ (反斜杠有时候不好用))
        // (Windowns 默认是 \ 但实际上 正反斜杠都支持)

        //如何在文件系统中如何定位我们的一个唯一的文件就成为当前要解决的问题，但这难不倒计算机科学
        //家，因为从树型结构的角度来看，树中的每个结点都可以被一条从根开始，一直到达的结点的路径所描
        //述，而这种描述方式就被称为文件的绝对路径（absolute path）。

        // 除了可以从根开始进行路径的描述，我们可以从任意结点出发，进行路径的描述，而这种描述方式就被
        //称为相对路径（relative path），相对于当前所在结点的一条路径。

        // 例如 : ( D:/CODE JavaEE/test)
        // (D 表示盘符 , 因此也就区分了两个不同的路径 : 绝对路径 : 以 c,d盘符开头的路径 ; 相对路径: 以当前所在的目录为基准, 以.或者..开头(.有时候省略),找到指定路径)
        // (什么叫 当前所在目录? 这里称作是 工作目录, 每个程序运行的时候, 都有一个工作目录.(在控制台里面通过命令操作的时候,是特别明显的;后来进化到图形化界面了,工作目录就没有那么直观了))
        // (a,b盘表示软盘, 也就是在历史上存在过)

        // 下面在举一个例子, 比如 有这样一个路径 d:/tmp/111
        // 还有 d:/tmp/222    (111和222这两个文件是同一级的 都在 tmp目录下面)
        // 如果工作目录不同,定位到同一个文件,相对路径的写法也不同.
        // 同样是定位到111这里
        // 如果工作目录是d:/               相对路径写作 ./tmp/111
        // 如果工作目录是d:/tmp            相对路径写作 ./111
        // 如果工作目录是d:/tmp/222        相对路径写作 ../111 (..表示当前目录的上级目录)
        // 如果工作目录是d:/tmp/222/bbb    相对路径写作 ../../111

        // 文件类型: 1) 文本文件(存的是文本,字符串). 2)二进制文件 (存的是二进制文件,不一定是字符串了)

        // 其他知识
        //即使是普通文件，根据其保存数据的不同，也经常被分为不同的类型，我们一般简单的划分为文本文件
        //和二进制文件，分别指代保存被字符集编码的文本和按照标准格式保存的非被字符集编码过的文件。
        //Windows 操作系统上，还有一类文件比较特殊，就是平时我们看到的快捷方式（shortcut），这种文
        //件只是对真实文件的一种引用而已。其他操作系统上也有类似的概念，例如，软链接（soft link）等。
        // 最后，很多操作系统为了实现接口的统一性，将所有的 I/O 设备都抽象成了文件的概念，使用这一理念
        //最为知名的就是 Unix、Linux 操作系统 —— 万物皆文件。

        //**** Java 中操作文件 ****
        // 1.针对文件系统操作 (文件的创建,删除,重命名....)
        // 2.针对文件内容操作 (文件的读和写)

        // Java 中通过java.io.File 类来对一个文件（包括目录）进行抽象的描述。注意，有 File 对象，并不
        //代表真实存在该文件。
        //java标准库中 提供了File这个类
        // 我们先来看看 File 类中的常见属性、构造方法和方法

        // 属性
        //修饰符及类型            //属性                            //说明
        //static String         // pathSeparator                //依赖于系统的路径分隔符，String 类型的表示
        // static char          // pathSeparator                // 依赖于系统的路径分隔符，char 类型的表示
        //(pathSeparator 在 File 里的一个静态变量) 就是 / 或者 \ 跟着系统走


        // 构造方法
        // 签名                                     //说明
        // File(File parent, String child)         //根据父目录 + 孩子文件路径，创建一个新的 File 实例
        // File(String pathname)                   //根据文件路径创建一个新的 File 实例，路径可以是绝对路径或者相对路径
        // File(String parent, String child)       //根据父目录 + 孩子文件路径，创建一个新的 File 实例，父目录用路径表示
        // (在 new File 对象的时候, 构造方法中,可以指定一个路径. 此时File对象就代表这个路径对应的文件了)
        // parent 当前文件的所在目录, child 自身的文件名字
        // 如: d:/cat.jpg (d 就是 parent child 就是 cat.jpg)


        //方法
        //
        //修饰符及返回值类型               方法签名         说明
        // String

        // **** 文件内容的读写 —— 数据流 ****
        // 针对文件内容 , 使用 "流对象" 进行操作 , (这是一个形象的比喻说法)
        // 水流 ~~ 生生不息 连绵不断
        // 可以将 从文件中读取 100 个字节 ,
        // 可以一次读 100 字节
        // 可以一次读 50个字节 两次读完,
        // 可以 一次读 10 个字节 十次读完
        // 就像取水一样,可以随时分次来去,而不会影响
        // (读文件是这样 , 写文件同理)
        //(因此就把读写文件的相关对象, 称为 "流对象")

        // java 标准库的流对象
        // 从类型上分为两大类:
        // 1. 字节流  (操作二进制数据的)
        // InputStream
        // OutputStream   (这两个是父类)
        // 还会衍生出两个子类
        // FileInputStream
        // FileOutputStream




        // 2. 字符流(操作文本数据的)
        // Reader ---> FileReader
        // Writer ---> FileWriter

        // 上面这些类的 使用的方式是非常固定的
        // 核心就是四个操作
        // 1) 打开文件(构造对象)
        // 2) 关闭文件 (close)
        // 3) 读文件(read) => 针对 InoutStream / Reader
        // 4) 写文件(writer) => 针对 OutputStream / Writer

        // **** 小程序练习 ****

        // 示例1
        // 扫描指定目录，并找到名称中包含指定字符的所有普通文件（不包含目录），并且后续询问用户是否要
        //删除该文件

        // 给定一个目录, 目录里会包含很多文件 和 子目录...
        // 用户输入一个要查询的次,看看当前目录下(以及子目录里) 是否有匹配的结果 (指的是文件名是不是匹配)
        // 如果有匹配的结果 就进行删除


        // 示例2
        //进行普通文件的复制

        // 示例3
        //扫描指定目录，并找到名称或者内容中包含指定字符的所有普通文件（不包含目录）
        //注意：我们现在的方案性能较差，所以尽量不要在太复杂的目录下或者大文件下实验 (和1 本质上是一样的)
        // (就是1 的一个变种)

    }
}